﻿//Copyright (C) Microsoft Corporation.  All rights reserved.
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Collections.Generic;

namespace Awesome.Library.Linq {

	public static class PredicateBuilder {

		public static Expression<Func<T, bool>> True<T>() { return f => true; }
		public static Expression<Func<T, bool>> False<T>() { return f => false; }

		public static Expression<Func<T, bool>> Or<T>( this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2 ) {
			var invokedExpr = Expression.Invoke( expr2, expr1.Parameters.Cast<Expression>() );
			return Expression.Lambda<Func<T, bool>>
				  ( Expression.OrElse( expr1.Body, invokedExpr ), expr1.Parameters );
		}

		public static Expression<Func<T, bool>> And<T>( this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2 ) {
			var invokedExpr = Expression.Invoke( expr2, expr1.Parameters.Cast<Expression>() );
			return Expression.Lambda<Func<T, bool>>
				  ( Expression.AndAlso( expr1.Body, invokedExpr ), expr1.Parameters );
		}
	}

}
